//
//  main.m
//  04_集合(字典)
//
//  Created by dllo on 16/7/7.
//  Copyright © 2016年 LST. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "ContactManager.h"
int main(int argc, const char * argv[]) {
    
    /* 1.字典
     * 存储键值对(Key -> Value)的集合类型
     * 字典中是没有顺序的
     * 通过key值存储, 查找 Value
     */
    // <1> 初始化
    // initWithObjectsAndKeys:Value, key, ...
    // 字典中只能存放对象类型 (NSObject的子类)
    // 如果出现汉字  代码提示会失效
    
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"李四", @"name", [NSNumber numberWithInt:12], @"age", nil];
    NSLog(@"%@", dic);
    // <2> 构造器
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"李四", @"name", [NSNumber numberWithInt:12], @"age", nil];
    NSLog(@"%ld", dictionary.count);
    // <3> 推荐使用字面量
    NSDictionary *diction = @{@"name": @"李四", @"age": @12};
    // <4> 取值
    // 1> 通过key取Value
    NSString *name = [diction objectForKey:@"name"];
    NSLog(@"%@", name);
    // 2> 获取所有key
    NSArray *allKeys = diction.allKeys;
    NSLog(@"%@", allKeys);
    // 3> 获取所有Value
    NSArray *allValues = diction.allValues;
    NSLog(@"%@", allValues);
    // 4> count
    NSUInteger count = diction.count;
    NSLog(@"%ld", count);
    // 5> 通过一个数组, 取到对应数组的Value
    NSArray *allValueArray = [diction objectsForKeys:diction.allKeys notFoundMarker:[NSString class]];
    NSLog(@"%@", allValueArray);
    // 6> 通过一个象查找所有Value是这个对象的所有的Key
    NSArray *array = [diction allKeysForObject:@"李四"];
    NSLog(@"%@", array);
    // 7> 语法糖取值 dic[key]
    NSLog(@"%@", diction[@"name"]);
    
    // 可变字典  NSMutableDictionary
    // 1.初始化 与不可变字典基本相同
    NSMutableDictionary *mutDic  = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"0.0", @"name", nil];
    // (不推荐使用字面量)
    NSMutableDictionary *mutDiction = [@{} mutableCopy];
    NSLog(@"%@",mutDiction);
    // 2.取值 与不可变字典相同
    // 3. 增 删 改
    // 1> 添加 setObject:value forKey:key
    // 如果key值已经存在, 会将之前的value覆盖
    // 如果key不存在, 会直接添加
    // 注意 字典中的key 不要重复, 如果重复, 会以最后的value进行覆盖
    [mutDic setObject:@"起名好难" forKey:@"name"];
    NSLog(@"%@", mutDic);
    // 2> 删除
    [mutDic removeObjectForKey:@"name"];
    // 移除全部
    [mutDic removeAllObjects];
    // 移除字典中的一个数组
    [mutDic removeObjectsForKeys:@[@"name"]];
    // 3> 语法糖 与setObjectForKey 相同
    mutDic[@"name"] = @"@.@";
    
    /* 练习
     完成以下需求
     需求：1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
     2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
     3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
     4、删除某个分组的全部联系人。
     */
    
    Contact *contact = [[Contact alloc] initWithName:@"A0.0" phoneNumber:@"119"];
    contact.groupName = @"A";
    Contact *contact2 = [[Contact alloc] initWithName:@"B0.0" phoneNumber:@"10086"];
    contact2.groupName = @"B";
    Contact *contact3 = [[Contact alloc] initWithName:@"C0.0" phoneNumber:@"110"];
    contact3.groupName = @"C";
    Contact *contact4 = [[Contact alloc] initWithName:@"D0.0" phoneNumber:@"120"];
    contact4.groupName = @"D";
    [contact showContact];
    NSMutableDictionary *groupDic = [NSMutableDictionary dictionary];
    //    // 判断名字和手机号是不是空值
    //    if (contact.name.length > 0 && contact.phoneNumber.length > 0) {
    //        // 都不是空值, 可以添加
    //        // 通过联系人的分组名, 取到对应的分组数组
    //        NSMutableArray *contactArr = [groupDic objectForKey:contact.groupName];
    //        // 判断数组是否存在
    //        if (contactArr == nil) {
    //            // 数组不存在, 创建数组
    //            contactArr = [NSMutableArray array];
    //            [contactArr addObject:contact];
    //            [groupDic setObject:contactArr forKey:contact.groupName];
    //        } else {
    //            // 数组存在, 直接添加
    //            [contactArr addObject:contact];
    //        }
    //
    //
    //        NSLog(@"添加%@成功", contact.name);
    //        // 否则, 添加失败
    //    } else {
    //        NSLog(@"添加失败");
    //    }
    ContactManager *contactManager = [[ContactManager alloc] initWithDictionary:groupDic];
    [contactManager addContact:contact];
    [contactManager addContact:contact2];
    [contactManager addContact:contact3];
    [contactManager addContact:contact4];
    NSLog(@"%@", contactManager.contactDic);
    // [contactManager description];
    
    // 集合
    // 不可变 NSSet
    // 可变 NSMutableSet
    // <1> 初始化
    // 集合会删除掉重复的内容 (互异性)
    // 要删除数组中重复的内容, 放入集合中
    NSSet *set = [[NSSet alloc] initWithObjects:@"含蓄", @"含蓄", @"0.0", nil];
    NSLog(@"%ld", set.count);
    // <2> 构造器
    NSSet *setObject = [NSSet setWithObjects:@"0.0", @"0.0", nil];
    NSLog(@"%@", setObject);
    // <3> 系统没有提供集合的字面量
    // 取值
    // 从集合中取出任意元素 (无序)
    [set anyObject];
    // count
    NSUInteger setCount = set.count;
    NSLog(@"%ld", setCount);
    // 集合去重(删除掉数组中重复的元素)
    NSArray *repeaArray = @[@10, @20, @10, @30, @10, @100];
    NSSet *repeaSet = [NSSet setWithArray:repeaArray];
    NSLog(@"%@", repeaSet);
   repeaArray = repeaSet.allObjects;
    NSLog(@"%@", repeaArray);
    // 可变集合 NSMutableSet
    // <1> 初始化与不可变集合一样
    // <2> 构造器与不可变集合一样
    // <3> 取值 anyObject
    // <4> 可变集合 可变性
    NSMutableSet *mutableSet = [NSMutableSet set];
    // 添加
    [mutableSet addObject:@"123"];
    // 删除
    [mutableSet removeObject:@"123"];
    [mutableSet removeAllObjects];
    return 0;
}
